package com.ke.rule.base;

import java.util.Collections;
import java.util.Map;

/**
 * 功能部件
 * 
 * @author guyu
 */
public interface IFuncUnit {

  /**
   * 获取优先级号, maybe null
   * @return
   */
  default Integer getPriorityNbr() {
    return null;
  }
  
  /**
   * 获取功能部件的应用对象
   * @return
   */
  default ApplyTo getApplyTo() {
    return null;
  }
  
  /**
   * 获取功能部件的入参
   * @return
   */
  default Map<String, String> getWithParams() {
    return null;
  }
  
  /**
   * 应用对象
   */
  public static interface ApplyTo {
    /**
     * 获取功能部件的应用类型
     * @return
     */
    default ApplyToType getType() {
      return ApplyToType.ENTITY;
    }
    
    /**
     * 功能部件适用到何处，需要依据ApplyToType进行解释
     * @return
     */
    default String getWhich() {
      return "";
    }
    
    /**
     * 以KV的形式返回which数据
     * @return
     */
    default Map<String, String> getWhichInKv() {
      return Collections.emptyMap();
    }
  }

  /**
   * 获取功能部件的匹配的字段映射
   * 仅当部件可绑定字段唯一时，入参可为空，此时返回唯一匹配的字段
   * 
   * @param bindableName 可绑定名称
   * @return 绑定的字段名数组
   */
  default String[] getApplyToFieldNames(String bindableName) { return null; }

  /**
   * 获取实参值,内部会根据形参声明的类型进行类型转换,若形参无实参数值则返回形参的缺省值
   * @param <T>
   * @param parameterName
   * @return
   */
  default <T> T getActualParameterValue(String parameterName) { return null; }
}
